package com.cy.forkjoin;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.RecursiveTask;

/**
 * 类说明：遍历指定目录（含子目录）找寻指定类型文件
 */
public class FindFileNums extends RecursiveTask<Integer> {

    private File path;

    public FindFileNums(File path) {
        this.path = path;
    }

    @Override
    protected Integer compute() {
        List<FindFileNums> subTasks = new ArrayList<>();

        File[] files = path.listFiles();
        int count = 0;
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    // 对每个子目录都新建一个子任务。
                    subTasks.add(new FindFileNums(file));
                } else {
                    count++;
                }
            }
            if (!subTasks.isEmpty()) {
                int sum = 0;
                // 在当前的 ForkJoinPool 上调度所有的子任务。
                for (FindFileNums subTask : invokeAll(subTasks)) {
                    sum += subTask.join();
                }
                return sum + count;
            }
        }
        return count;
    }

    public static void main(String[] args) {
        try {
            // 用一个 ForkJoinPool 实例调度总任务
            ForkJoinPool pool = new ForkJoinPool();
            FindFileNums task = new FindFileNums(new File("/Users/apple"));

            /*异步提交*/
            pool.invoke(task);
            //阻塞方法
            Integer join = task.join();
            System.out.println(join);
            System.out.println("Task end");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
